雖然說是變魔術,但其實並沒有特別說特別厲害,其實就是透過位元的平移來讓數值改變,又或是使用and/or/nor
來進行數值的變換;之所以說「平移來讓數值改變」,就是讓整個二進位表示的數值再多加幾個位元來讓值變大,又或是反過來減少幾個位元來讓值變小,就先在這裡進行示範吧:
origin = 0b101 #也就是5
set_left = origin << 2 #透過將origin向左平移兩位來使其值變大
set_right = origin >> 1 #相對的,透過將origin向右平移兩位來使其值變小
print(bin(origin))
print(bin(set_left))
print(bin(set_right)) #這三行都是印出二進位表示法的數值
print(int(origin))
print(int(set_left))
print(int(set_right)) #這三行則是將二進位的值轉為int後輸出
而輸出結果會像這樣:
0b101
0b10100
0b10
5
20
2
其實這個「平移」的功能就像是「無條件進位/捨去」,只是從常見的十進位改成是二進位了
接下來就來說明and/or/nor
的功能,用比較簡單的文字來說明的話就是兩者皆有/兩者所擁有的/兩者之間的差異
,那就來點範例吧:
setter = 0b110010 #32+16+2=50
testing = 0b101010 #32+8+2=42
and_test = setter & testing #使用and運算元
or_test = setter | testing #使用or運算元
nor_test = setter ^ testing #使用nor運算元
print(bin(and_test))
print(bin(or_test))
print(bin(nor_test))
輸出如下:
0b100010 #兩者皆有的位元在5次與1次
0b111010 #兩者擁有的範圍在5,4,3,1次
0b11000 #正確一點的解釋方式,其實是「互斥」
我覺得這好複雜@@